package com.example.atomic;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

public class AtomicIntegerTest {

    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger();
        int newValue = 10;
        int expect = 10;
        int u = 2;
        int delta = 5;
        // 取得当前值
        atomicInteger.get();
        // 设置当前值
        atomicInteger.set(newValue);
        // 设置新值，并返回旧值
        atomicInteger.getAndSet(newValue);
        // 如果当前值为expect，则设置为u
        atomicInteger.compareAndSet(expect, u);
        // 当前值加1，返回旧值
        atomicInteger.getAndIncrement();
        // 当前值减1，返回旧值
        atomicInteger.getAndDecrement();
        // 当前值增加delta，返回旧值
        atomicInteger.getAndAdd(delta);
        // 当前值加1，返回新值
        atomicInteger.incrementAndGet();
        // 当前值减1，返回新值
        atomicInteger.decrementAndGet();
        // 当前值增加delta，返回新值
        atomicInteger.addAndGet(delta);

        AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(10);
        // 取得当前值
        atomicIntegerArray.get(1);
        // 设置当前值
        atomicIntegerArray.set(1, 2);
        // 设置新值，并返回旧值
        atomicIntegerArray.getAndSet(1, 3);
        // 如果当前值为expect，则设置为u
        atomicIntegerArray.compareAndSet(1, expect, u);
        // 当前值加1，返回旧值
        atomicIntegerArray.getAndIncrement(1);
        // 当前值减1，返回旧值
        atomicIntegerArray.getAndDecrement(1);
        // 当前值增加delta，返回旧值
        atomicIntegerArray.getAndAdd(1, 10);
        // 当前值加1，返回新值
        atomicIntegerArray.incrementAndGet(1);
        // 当前值减1，返回新值
        atomicIntegerArray.decrementAndGet(1);
        // 当前值增加delta，返回新值
        atomicIntegerArray.addAndGet(1, 10);

        AtomicIntegerFieldUpdater<Candidate> score = AtomicIntegerFieldUpdater.newUpdater(Candidate.class, "score");
        Candidate stu = new Candidate();
        score.incrementAndGet(stu);
        score.set(stu, 10);
    }

    public static class Candidate {
        int id;
        // 如果直接把int改成atomicinteger, 可能对代码破坏比较大
        // 因此使用AtomicIntegerFieldUpdater对score进行封装
        volatile int score;
    }
}
